package io.FileStream;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Function;
import java.util.function.IntFunction;

public class TEST3 {
    /*
    修改文件中的数据   2-1-9-7-5-8
    修改后的文件数据   1-2-5-7-8-9

    细节一：文件中的数据不要换行，如果换行那么在文件数据的末尾隐藏着\r\n，排序就会出现问题
    细节二：如果引用的是本地的文件而不是java中的文件，在本地文件中的开头有一个隐藏的 bom头
    bom头指的是给文件的格式，字符编码等隐藏信息。改掉bom头可以在txt文件下选择utf-8的格式
     */
    public static void main(String[] args) throws IOException {

/*//                  常规方法

//        读取数据源，由于是纯文本文件，所以在这里使用reader/writer
        FileReader fr=new FileReader("a.txt");
//        将读取到的数据拼接到StringBuilder中
        StringBuilder sb=new StringBuilder();
//        获取里面的每一个数据
        int b;
        while ((b=fr.read())!=-1){
//            将文件中的数据写到sb中以便于排序
            sb.append((char)b);
        }
        fr.close();
        System.out.println(sb);//2-1-9-7-5-8
//      排序

        //将其变为字符串的形式,然后就可以利用split方法进行切割排序
//        但是得到的数据是String类型不是int类型。即需要将其放到数组中并建立ArrayList方法获取数组的元素，将其转化为int类型

        String str=sb.toString();
        String[]arr=str.split("-");

        ArrayList<Integer> list=new ArrayList<>();
//        遍历arr数组获取其中的数据，并在获取中进行强转，添加到list集合中
        for (String s : arr) {
            int i = Integer.parseInt(s);
            list.add(i);
        }
        Collections.sort(list);//排序
        System.out.println(list);
//        写出
        FileWriter fw=new FileWriter("a.txt");
        for (int i = 0; i < list.size(); i++) {
            if (i==list.size()-1){
                fw.write(list.get(i)+"");
            }else {
                fw.write(list.get(i)+"-");
            }
            }
        fw.close();*/

//        非常规方法
//        1.读取数据
        FileReader fr=new FileReader("a.txt");
//        将文件的数据放到StringBuilder中
        StringBuilder sb=new StringBuilder();
        int b;
        while ((b=fr.read())!=-1){
            sb.append((char)b);
        }
        fr.close();
        System.out.println(sb);


//        排序，常规方法的排序是将sb中的数据文件变成字符串的形式，并使用split方法将其分离
//        然后将分离得到的字符串变成Integer的形式并进行排序。所以可以调用Arrays.stream

        Integer[] arr = Arrays.stream(sb.toString()
                        .split("-"))
                .map(Integer::parseInt)
                .sorted()
                .toArray(Integer[]::new);
        /*     复杂方法
   Integer[] arr = Arrays.stream(sb.toString().split("-"))
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s);
                    }
                }).sorted().toArray(new IntFunction<Integer[]>() {
                    @Override
                    public Integer[] apply(int value) {
                        return new Integer[0];
                    }
                });*/
//        写出
        FileWriter fw=new FileWriter("a.txt");
        String s=Arrays.toString(arr).replace(",","-");
        String result = s.substring(1, s.length() - 1);
//        System.out.println(result);
        fw.write(result);
        fw.close();

    }
}
